# -*- coding: utf-8 -*-
from django.db import models
from django.contrib.auth.models import User
from lr.catalogue.models import Genre
import datetime


class ContestManager(models.Manager):
    """ Менеджер создания новых конкурсов """
    
    def create_contest(self, initiator, cash, title, theme, time_limit, competitors_limit=0,
                       genre=None, start_time=None, is_personal=False, for_exclusive=False):
        """ Создать новый конкурс """
        new_contest = self.create(initiator=initiator, competitors_limit=competitors_limit,
                                  cash=cash, title=title, genre=genre, theme=theme, start_time=start_time,
                                  time_limit=time_limit, is_personal=is_personal, for_exclusive=for_exclusive)
        return new_contest




class Contest(models.Model):
    """ Конкурс """
    initiator = models.ForeignKey(User, related_name='contest_initiator', verbose_name=u'Инициатор')
    competitors = models.ManyToManyField(User, blank=True, null=True, verbose_name=u'Участники', related_name='contest_competitors')
    competitors_limit = models.IntegerField(default=0, verbose_name=u'Макс. кол-во участников')
    cash = models.DecimalField(max_digits=10, decimal_places=2, default=0, verbose_name=u'Награда')
    title = models.CharField(max_length=127, verbose_name=u'Заголовок')
    genre = models.ForeignKey(Genre, blank=True, null=True, verbose_name=u'Жанр', related_name='contest_genre')
    theme = models.TextField(verbose_name=u'Задача конкурса')
    start_time = models.DateTimeField(blank=True, null=True, verbose_name=u'Старт конкурса')
    time_limit = models.DateTimeField(verbose_name=u'Дата окончания')
    is_personal = models.BooleanField(default=False, verbose_name=u'Персональный заказ')
    for_exclusive = models.BooleanField(default=False, verbose_name=u'Эксклюзивные права на произведение')
    
    objects = ContestManager()
    
    
    class Meta:
        verbose_name = u'Конкурс'
        verbose_name_plural = u'Конкурсы'
    
    
    def __unicode__(self):
        """ Имя поля в админке """
        return '%s (%.2f)' % (self.initiator.username, self.cash)
    
    
    def finish_time(self):
        """ Возвращает время завершения конкурса """
        if self.time_limit:
            if datetime.datetime.now() > self.time_limit:
                return u'Завершен'
            return self.time_limit.strftime('%d.%m.%Y %H:%M')
        return u'Неограничено'
    
    
    def is_finished(self):
        """ Проверка на завершение конкурса """
        if self.time_limit:
            if datetime.datetime.now() < self.time_limit:
                return False
        return True
    
    
    def status(self):
        """ Возвращает текущий статус кокурса - стартовал, или идет набор участников """
        s = self.get_status()
        if s > 0:
            return u'Ждем еще %d конкурсантов' % s
        elif s == 0:
            return u'Ждем конкурсантов'
        return u'Конкурс стартовал'
    
    
    def get_status(self):
        """ Возвращает текущий статус: <0 - набор завершен, ==0 - набор неограничен, >0 - набор лимитирован """
        if self.is_personal:
            return -1
        if self.start_time:
            if datetime.datetime.now() > self.start_time:
                return -1
        if self.competitors_limit > 0:
            room = self.competitors_limit - self.competitors.all().count()
            if room > 0:
                return room
            else:
                return -1
        return 0
